//
//  ViewController.m
//  26-GCD
//
//  Created by 王道林 on 16/8/18.
//  Copyright © 2016年 王道林. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self lianxi];
    // 1 . GCD Grand Central Dispatch(调度)
    
    // 2 . GCD的核心概念 . 队列, 任务拆分分配到队列中, 系统会自动为我们创建线程的调度线程, 自动
    
    // 3 . GCD中得队列严格遵循FIFO(先进先出)原则
    //    队列分类
    //    (1). 串行 DISPATCH_QUEUE_SERIAL   /    NULL就是空
    //    (2). 并发 DISPATCH_QUEUE_CONCURRENT
    
    // 4. 队列的创建
    // 1>
   dispatch_queue_t serial = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    
    dispatch_queue_t concurrent = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
    
    //  主队列.. 串行
    dispatch_queue_t main = dispatch_get_main_queue();

    //  全局队列
    // 参数1 :  调度队列优先级
    // 参数2:  给未来用, 填写0就行
    dispatch_queue_t globalQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    // 术语 :
    // 1.串行, 一个任务执行完毕,  再执行下一个
    // 2.并发, 多个任务同时执行
    // 3.同步,  在当前线程执行任务,, 不能开辟线程
    // 4.异步,  在新的线程执行任务, 可以开辟线程
    

    //  5   同步, 异步
    //  同步 串行队列...不会创建线程
//    [self syncSerialQueue:serial];
    
    //  同步, 并发.... 不会创建线程
//    [self syncConcurrenQueue:concurrent];
    
    // 同步  主线程队列
    // 主线程 同步 主线程
    // 主线程等待同步操作结束, 同步操作在主线程执行, 相互等待, 导致程序卡死;
//    dispatch_sync(main, ^{
//        for (int i = 0; i < 10; i ++) {
//            NSLog(@"main:%d-----%@", i,
//                  [NSThread currentThread]);
//        }
//
//    });
    
    // 同步  全局队列   不会创建线程.
//    dispatch_sync(globalQueue, ^{
//        for (int i = 0; i < 10; i ++) {
//            NSLog(@"%d-----%@", i,
//                  [NSThread currentThread]);
//        }
// 
//    });
//    
    
    //  2> 异步
    // 异步  串行   创建一个新的线程, 在该线程中执行
    [self asyncSerialQueue:serial];
    
    // 异步并发
    // 异步 并发队列 ,根据任务决定需要创建多少线程
//    [self asyncConcurrenQueue:concurrent];
    
    // 异步 主线程队列
//    [self asyncMainQueue:main];
    
    
    // 6 . group
    //  1> 组的创建
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
    // 2> 组中只有异步
    
    dispatch_group_async(group, serialQueue1, ^{
        NSLog(@"group----%@", [NSThread currentThread]);
    });
    
    
    // 所有任务都执行完毕, 会调用下列方法.
    dispatch_group_notify(group, main, ^{
        NSLog(@"完成操作的时候, 执行的后续操作");
    });

}
#pragma mark -  同步
// 同步 串行
- (void)syncSerialQueue:(dispatch_queue_t)serialQueue
{
    // block 中得 会追加到队列中
    NSLog(@"同步 串行");
     for (int i = 0; i < 10; i ++) {
    dispatch_sync(serialQueue, ^{
       
            NSLog(@"%d-----%@", i,
                  [NSThread currentThread]);
    });
     }

}

// 同步  并发
- (void)syncConcurrenQueue:(dispatch_queue_t)ConcurrenQueue
{
    NSLog(@"同步并发");
    for (int i = 0; i < 10; i ++) {
    dispatch_sync(ConcurrenQueue, ^{
            NSLog(@"%d-----%@", i,
                  [NSThread currentThread]);
        
    });
    }
}

#pragma mark -  异步
// 异步  串行   创建一个新的线程, 在该线程中执行
- (void)asyncSerialQueue:(dispatch_queue_t)serialQueue
{
    NSLog(@"异步 串行");
    for (int i = 0; i < 10; i ++) {
        dispatch_async(serialQueue, ^{
            
            NSLog(@"%d-----%@", i,
                  [NSThread currentThread]);
        });
    }

}


- (void)asyncConcurrenQueue:(dispatch_queue_t)ConcurrenQueue
{
    NSLog(@"异步并发");
    for (int i = 0; i < 10; i ++) {
    dispatch_async(ConcurrenQueue, ^{
            NSLog(@"%d-----%@", i,
                  [NSThread currentThread]);
    });
    }
}

- (void)asyncMainQueue:(dispatch_queue_t)main
{
    NSLog(@"异步主线程");
    for (int i = 0; i < 10; i ++) {
        dispatch_async(main, ^{
            NSLog(@"%d-----%@", i,
                [NSThread currentThread]);
        });
    }
}

// 练习加载图片
- (void)lianxi
{
    
    dispatch_queue_t queueSeral = dispatch_queue_create("seral", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queueSeral, ^{
        NSLog(@"########################%@", [NSThread currentThread]);
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://cdn.duitang.com/uploads/blog/201602/19/20160219211647_TPaUr.jpeg"]];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"################%@", [NSThread currentThread]);

            _imageView.image = [UIImage imageWithData:data];
        });
        
    });
    

}
- (IBAction)buttonLianxi:(id)sender {
    
    
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
